package tt.dz.egobus.servicemanager.service;

import tt.dz.egobus.servicemanager.base.service.ExtendBaseService;
import tt.dz.egobus.servicemanager.core.exception.BusinessException;
import tt.dz.egobus.servicemanager.entities.Bus;
import tt.dz.egobus.servicemanager.service.impl.BusServiceImpl;

/**
 * @author Anson
 * @date 17-3-16
 * @name 车辆服务方法
 * @since 1.0.1
 */
public interface BusService extends ExtendBaseService<Bus, String> {

    /**
     * @param id 当前车辆id
     * @author Anson
     * @date 17-3-21
     * @name 车辆申城二维码
     * @since 1.0.2
     */
    byte[] generationQRCode(String id);

    /**
     * @param busId 更新的车辆
     * @author Anson
     * @date 17-3-28
     * @name 更新车为使用状态
     * @since 1.0.3
     */
    boolean updateBusUseStatus(String busId) throws BusinessException;

    /**
     * @param busId 更新的车辆
     * @param type  当前状态
     * @author Anson
     * @date 17-3-28
     * @name 更新当前车的状态
     * @since 1.0.3
     */
    boolean updateBusStatus(String busId, Bus.BusTypeEnum type) throws BusinessException;

    /**
     * @param busId 更新的车辆
     * @author Anson
     * @date 17-3-28
     * @name 更新车为未使用状态
     * @since 1.0.3
     */
    boolean updateBusUnUseStatus(String busId);

    /**
     * @param busId 更新的车辆
     * @author Anson
     * @date 17-3-28
     * @name 更新车为异常状态
     * @since 1.0.3
     */
    boolean updateBusExceptionStatus(String busId);

    /**
     * @param busNo 车牌号
     * @author Anson
     * @date 17-5-15
     * @name 根据当前车牌号, 获取未报废的车辆信息
     * @since 1.0.4
     */
    Bus getUnBrokenBusByBusNo(String busNo);

    /**
     * @param busNo 车牌号
     * @author Anson
     * @date 17-5-15
     * @name 根据当前上报异常的未报废车辆, 修改其状态为使用
     * {@linkplain tt.dz.egobus.servicemanager.entities.Bus.BusTypeEnum#NOT_USE}
     * @since 1.0.4
     */
    void updateExceptionBusUnUsed(String busNo);

    /**
     * @param id busId
     * @throws BusinessException 校验不通过的时候
     * @author Anson
     * @date 17-5-24
     * @name 在bus删除之前做一些处理服务
     * 处理一些关联的校验以及事务
     * @since 1.0.4
     */
    void preDeleteBusService(String id) throws BusinessException;

    /**
     * @param bus
     * @return true:处于司机控制的状态中 false:未处于司机控制状态种
     * @throws BusinessException 校验不通过的时候
     * @author Anson
     * @date 17-5-24
     * @name 判断当前车辆状态是否处于司机控制状态
     * @see BusServiceImpl#isBusStatusInDriverController(Bus)
     * @since 1.0.4
     */
    boolean isBusStatusInDriverController(Bus bus);
}
